package manejador;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.List;

import persistencia.Conexion;
import entidad.CalificacionDetalle;

import interfaz.IEntidad;
import interfaz.IManejador;

public class ManejadorDeCalificacionDetalle implements IManejador {

	private ResultSet rs = null;
	private PreparedStatement stmt = null;
	private static ManejadorDeCalificacionDetalle instancia = null;
	private CalificacionDetalle calificacionDetalle = null;
	private List<IEntidad> calificacionesDetalle = null;

	private Conexion conexion = null;

	private ManejadorDeCalificacionDetalle() {
		conexion = Conexion.getInstancia();

	}

	public static ManejadorDeCalificacionDetalle getInstancia() {
		if (instancia == null) {
			instancia = new ManejadorDeCalificacionDetalle();
		}
		return instancia;
	}

	@Override
	public int agregar(IEntidad entidad) {
		int fila = 0;
		String sql = "INSERT INTO sistema_informacion.calificacion_detalle VALUES(0,?, ?, ?, ?, ?);";
		stmt = conexion.hacerEnunciado(sql);
		calificacionDetalle = (CalificacionDetalle) entidad;
		try {
			stmt.setString(1, calificacionDetalle.getDescripcion());
			stmt.setInt(2, calificacionDetalle.getNotaAcumulada());
			stmt.setDate(3, calificacionDetalle.getFecha());
			stmt.setString(4, calificacionDetalle.getEstatus());
			stmt.setInt(5, calificacionDetalle.getIdCalificacion());
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return fila;
	}

	@Override
	public int eliminar(int id) {
		return 0;
	}

	@Override
	public List<IEntidad> getEntidad() {
		return null;
	}

	public List<IEntidad> getEntidadDinamica(String parametro,
			int idEstudiante, int idCurso) {
		calificacionesDetalle = new ArrayList<IEntidad>();
		String sql = "";
		if (parametro.equals("ACTIVO")) {
			sql = "SELECT DISTINCT curso.id_curso ,calificacion.id_calificacion ,calificacion_detalle.* ,calificacion_estudiante.* ,estudiante.id_estudiante FROM curso,calificacion,calificacion_detalle,calificacion_estudiante,estudiante WHERE calificacion_detalle.estatus="
					+ "'"
					+ parametro
					+ "'"
					+ " AND calificacion_estudiante.id_estudiante=estudiante.id_estudiante AND calificacion_estudiante.id_curso=curso.id_curso AND calificacion_estudiante.id_calificacion=calificacion.id_calificacion AND calificacion_detalle.id_calificacion=calificacion.id_calificacion AND calificacion_estudiante.id_estudiante="
					+ idEstudiante
					+ " AND calificacion_estudiante.id_curso="
					+ idCurso;

		} else if (parametro.equals("INACTIVO")) {
			sql = "SELECT DISTINCT curso.id_curso ,calificacion.id_calificacion ,calificacion_detalle.* ,calificacion_estudiante.* ,estudiante.id_estudiante FROM curso,calificacion,calificacion_detalle,calificacion_estudiante,estudiante WHERE calificacion_detalle.estatus="
					+ "'"
					+ parametro
					+ "'"
					+ " AND calificacion_estudiante.id_estudiante=estudiante.id_estudiante AND calificacion_estudiante.id_curso=curso.id_curso AND calificacion_estudiante.id_calificacion=calificacion.id_calificacion AND calificacion_detalle.id_calificacion=calificacion.id_calificacion AND calificacion_estudiante.id_estudiante="
					+ idEstudiante
					+ " AND calificacion_estudiante.id_curso="
					+ idCurso;

		} else if (parametro.equals("TODOS")) {
			sql = "SELECT DISTINCT curso.id_curso ,calificacion.id_calificacion ,calificacion_detalle.* ,calificacion_estudiante.* ,estudiante.id_estudiante FROM curso,calificacion,calificacion_detalle,calificacion_estudiante,estudiante WHERE "
					+ "calificacion_estudiante.id_estudiante=estudiante.id_estudiante AND calificacion_estudiante.id_curso=curso.id_curso AND calificacion_estudiante.id_calificacion=calificacion.id_calificacion AND calificacion_detalle.id_calificacion=calificacion.id_calificacion AND calificacion_estudiante.id_estudiante="
					+ idEstudiante
					+ " AND calificacion_estudiante.id_curso="
					+ idCurso;

		}

		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);

		try {
			while (rs.next()) {
				IEntidad calificacionDetalle = new CalificacionDetalle(rs
						.getInt("id_calificacion_detalle"), rs
						.getString("descripcion"), rs.getInt("nota_acumulada"),
						rs.getDate("fecha"), rs.getString("estatus"), rs
								.getInt("id_calificacion"));
				calificacionesDetalle.add(calificacionDetalle);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return calificacionesDetalle;
	}

	@Override
	public IEntidad getEntidadPorId(int id) {

		String sql = "SELECT * FROM sistema_informacion.calificacion_detalle WHERE id_calificacion_detalle ="
				+ id;
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);
		try {
			while (rs.next()) {
				calificacionDetalle = new CalificacionDetalle(rs
						.getInt("id_calificacion_detalle"), rs
						.getString("descripcion"), rs.getInt("nota_acumulada"),
						rs.getDate("fecha"), rs.getString("estatus"), rs
								.getInt("id_calificacion"));
				calificacionesDetalle.add(calificacionDetalle);

			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return calificacionDetalle;
	}

	@Override
	public int modificar(IEntidad entidad, int id) {
		int fila = 0;
		calificacionDetalle = (CalificacionDetalle) entidad;
		String sql = "UPDATE sistema_informacion.calificacion_detalle SET descripcion = ?, nota_acumulada = ? , fecha = ? , estatus = ? WHERE id_calificacion_detalle = ? ;";
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setString(1, calificacionDetalle.getDescripcion());
			stmt.setInt(2, calificacionDetalle.getNotaAcumulada());
			stmt.setDate(3, calificacionDetalle.getFecha());
			stmt.setString(4, calificacionDetalle.getEstatus());
			stmt.setInt(5, id);
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return fila;
	}

	public int agregarCursoEstudianteCalificacion(int idEstudiante,
			int idCalificacion, int idCurso) {
		int fila = 0;
		String sql = "INSERT INTO sistema_informacion.calificacion_estudiante (id_estudiante, id_calificacion, id_curso) VALUES (?, ?, ?);";
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setInt(1, idEstudiante);
			stmt.setInt(2, idCalificacion);
			stmt.setInt(3, idCurso);
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return fila;
	}

	public int cambiarEstatus(int id) {
		int fila = 0;
		calificacionDetalle = (CalificacionDetalle) ManejadorDeCalificacionDetalle
				.getInstancia().getEntidadPorId(id);
		String estatus = calificacionDetalle.getEstatus().equalsIgnoreCase(
				"ACTIVO") ? "INACTIVO" : "ACTIVO";
		String sql = "UPDATE calificacion SET estatus= ? WHERE id_calificacion="
				+ id;
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setString(1, estatus);
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return fila;

	}

	public int cambiarEstatusACompleto(int idCalificacion) {
		int fila = 0;
		calificacionDetalle = (CalificacionDetalle) ManejadorDeCalificacionDetalle
				.getInstancia().getEntidadPorId(idCalificacion);

		String sql = "UPDATE calificacion_detalle SET estatus= 'COMPLETO' WHERE id_calificacion_detalle="
				+ idCalificacion;
		stmt = conexion.hacerEnunciado(sql);
		try {

			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return fila;

	}

	public int cambiarEstatusCalificacionACompleto(int idEstudiante) {
		int fila = 0;
		String sql = "UPDATE calificacion SET estatus='COMPLETADO' WHERE id_calificacion="
				+ idEstudiante;
		stmt = conexion.hacerEnunciado(sql);
		try {
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return fila;
	}

	public int getNotaCursoActivo(int idEstudiante, int idCurso) {
		int notaCurso = 0;
		String sql = "SELECT DISTINCT curso.id_curso ,calificacion.id_calificacion ,calificacion_detalle.id_calificacion_detalle, calificacion_detalle.id_calificacion,calificacion_detalle.nota_acumulada ,calificacion_estudiante.* ,estudiante.id_estudiante FROM curso,calificacion,calificacion_detalle,calificacion_estudiante,estudiante WHERE calificacion_estudiante.id_estudiante=estudiante.id_estudiante AND calificacion_estudiante.id_curso=curso.id_curso AND calificacion_estudiante.id_calificacion=calificacion.id_calificacion AND calificacion_detalle.id_calificacion=calificacion.id_calificacion AND calificacion_detalle.estatus='ACTIVO' AND calificacion_estudiante.id_estudiante="
				+ idEstudiante
				+ " AND calificacion_estudiante.id_curso="
				+ idCurso;

		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);

		try {
			while (rs.next()) {

				notaCurso += rs.getInt("nota_acumulada");

			}
		} catch (SQLException e) {

			e.printStackTrace();
		}

		return notaCurso;
	}

	public int getNotaCursoCompleto(int idEstudiante, int idCurso) {
		int notaCurso = 0;
		String sql = "SELECT DISTINCT curso.id_curso ,calificacion.id_calificacion ,calificacion_detalle.id_calificacion_detalle, calificacion_detalle.id_calificacion,calificacion_detalle.nota_acumulada ,calificacion_estudiante.* ,estudiante.id_estudiante FROM curso,calificacion,calificacion_detalle,calificacion_estudiante,estudiante WHERE calificacion_estudiante.id_estudiante=estudiante.id_estudiante AND calificacion_estudiante.id_curso=curso.id_curso AND calificacion_estudiante.id_calificacion=calificacion.id_calificacion AND calificacion_detalle.id_calificacion=calificacion.id_calificacion  AND calificacion_estudiante.id_estudiante="
				+ idEstudiante
				+ " AND calificacion_estudiante.id_curso="
				+ idCurso;
		
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);

		try {
			while (rs.next()) {

				notaCurso += rs.getInt("nota_acumulada");

			}
		} catch (SQLException e) {

			e.printStackTrace();
		}

		return notaCurso;
	}

	/*
	 * public List<Integer> getNotaCursoPromedioFinal(int idEstudiante, int
	 * idCurso) { calificacionFinal = new ArrayList<Integer>(); int notaCurso =
	 * 0; int notaPromedio = 0; String sql =
	 * "SELECT curso.id_curso ,calificacion.* ,calificacion_estudiante.* ,estudiante.id_estudiante FROM curso,calificacion,calificacion_estudiante,estudiante WHERE calificacion.id_calificacion=calificacion_estudiante.id_calificacion AND estudiante.id_estudiante=calificacion_estudiante.id_estudiante AND calificacion.estatus='ACTIVO' AND calificacion_estudiante.id_estudiante="
	 * + idEstudiante +
	 * " AND  calificacion_estudiante.id_curso=curso.id_curso AND calificacion_estudiante.id_curso="
	 * + idCurso; stmt = conexion.hacerEnunciado(sql); rs =
	 * conexion.hacerConsulta(sql); try { while (rs.next()) {
	 * 
	 * notaCurso += rs.getInt("nota_curso");
	 * 
	 * } notaPromedio = notaCurso; calificacionFinal.add(notaCurso);
	 * calificacionFinal.add(notaPromedio); } catch (SQLException e) { // TODO
	 * Auto-generated catch block e.printStackTrace(); }
	 * 
	 * return calificacionFinal; }
	 */

	@Override
	public int agregarEmpleadoConCelular(IEntidad entidad) {
		return 0;
	}

	public List<Integer> getIDSCalificaciones(int idEstudiante, int idCurso) {
		List<Integer> idCalificacionesDetalle = new ArrayList<Integer>();
		/*
		 * calificacion = (Calificacion) ManejadorDeCalificacion.getInstancia()
		 * .getEntidadPorId(idCalificacion);
		 */

		String sql = "SELECT DISTINCT curso.id_curso ,calificacion.*,calificacion_detalle.id_calificacion_detalle,calificacion_estudiante.* ,estudiante.id_estudiante FROM curso,calificacion,calificacion_detalle,calificacion_estudiante,estudiante WHERE calificacion_estudiante.id_calificacion=calificacion.id_calificacion AND calificacion_estudiante.id_estudiante=estudiante.id_estudiante AND calificacion_estudiante.id_curso=curso.id_curso AND calificacion_detalle.id_calificacion=calificacion.id_calificacion AND calificacion_estudiante.id_estudiante="
				+ idEstudiante
				+ " AND  calificacion_estudiante.id_curso="
				+ idCurso;

		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);

		try {

			while (rs.next()) {

				idCalificacionesDetalle.add(rs
						.getInt("id_calificacion_detalle"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return idCalificacionesDetalle;

	}

	public int cambiarEstatusCalificacionACompleto(int idEstudiante, int idCurso) {
		int fila = 0;
		List<Integer> idCalificaciones = this.getIDSCalificaciones(
				idEstudiante, idCurso);

		for (int i : idCalificaciones) {

			String sql = "UPDATE calificacion_detalle SET estatus='COMPLETADO' WHERE id_calificacion_detalle="
					+ i;
			stmt = conexion.hacerEnunciado(sql);
			try {
				fila = stmt.executeUpdate();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		return fila;
	}

	public int cambiarEstatusCalificacionAActivo(int idEstudiante, int idCurso) {
		int fila = 0;
		List<Integer> idCalificaciones = this.getIDSCalificaciones(
				idEstudiante, idCurso);

		for (int i : idCalificaciones) {

			String sql = "UPDATE calificacion_detalle SET estatus='ACTIVO' WHERE id_calificacion_detalle="
					+ i;
			stmt = conexion.hacerEnunciado(sql);
			try {
				fila = stmt.executeUpdate();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		return fila;
	}

	public int verificarCalificacion(int idEstudiante, int idCurso) {

		// eSTE METODO VERIFICA SI HAY ALGUNA CALIFICACION ASOCIADA A
		// CALIFICACION DETALLE EN LA BD
		int idCalificacion = 0;
		String sql = "SELECT curso.id_curso ,calificacion.id_calificacion ,calificacion_detalle.id_calificacion_detalle, calificacion_detalle.id_calificacion ,calificacion_estudiante.* ,estudiante.id_estudiante FROM curso,calificacion,calificacion_detalle,calificacion_estudiante,estudiante WHERE calificacion_estudiante.id_estudiante=estudiante.id_estudiante AND  calificacion_estudiante.id_curso=curso.id_curso AND calificacion_estudiante.id_calificacion=calificacion.id_calificacion AND  calificacion_detalle.id_calificacion=calificacion.id_calificacion AND calificacion_estudiante.id_estudiante="
				+ idEstudiante
				+ " AND   calificacion_estudiante.id_curso="
				+ idCurso;

		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);
		try {

			while (rs.next()) {
				idCalificacion = rs.getInt("id_calificacion");

			}

		} catch (SQLException e) {
			e.printStackTrace();
		}

		return idCalificacion;
	}

}
